<?php

declare(strict_types=1);

namespace app\utils;

use ZipArchive;

class ZipUtils
{
    public function packZip($source, $dest)
    {
        //判断zip扩展是否加载或者文件目录是否存在
        if (!extension_loaded('zip') || !file_exists($source)) {
            return false;
        }
        //创建一个zip打包文件
        $zip = new ZipArchive();

        if (!$zip->open($dest, ZipArchive::CREATE)) {
            return false;
        }

        $source = str_replace('\\', '/', realpath($source));
        
        if (is_dir($source) === true) {
            //创建件一个目录迭代器
            $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source));

            foreach ($files as $file) {
                $file = str_replace('\\', '/', $file);
                //忽略当前目录和上级目录
                if (in_array(substr($file, strrpos($file, '/') + 1), array('.', '..'))) {
                    continue;
                }
                if (is_dir($file) === true) {
                    //创建一个子目录
                    $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
                } else if (is_file($file) === true) {
                    //创建一个子文件
                    $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
                } else if (is_file($source) === true) {
                    //创建文件根目录下的文件
                    $zip->addFromString(basename($source), file_get_contents($source));
                }
            }
            $zip->close();
        }
    }

    protected function addFileToZip(string $path,  ZipArchive $zip)
    {
        $handler = opendir($path); //打开当前文件夹由$path指定。
        while (($filename = readdir($handler)) !== false) {
            if ($filename != "." && $filename != "..") { //文件夹文件名字为'.'和‘..’，不要对他们进行操作
                if (is_dir($path . "/" . $filename)) {
                    $this->addFileToZip($path . "/" . $filename, $zip);
                } else {
                    $zip->addFile($path . "/" . $filename);
                }
            }
        }
        @closedir($handler);
    }


    /**
     * 删除临时路径
     * @param $path
     */
    public function deleteDir($path)
    {
        if (is_dir($path)) {
            //
            $dirs = scandir($path);
            foreach ($dirs as $dir) {
                if ($dir != '.' | $dir != '..') {
                    $sonDir = $path . '/' . $dir;
                    if (is_dir($sonDir)) {
                        $this->deleteDir($sonDir);
                        @rmdir($sonDir);
                    } else {
                        @unlink($sonDir);
                    }
                }
            }
            @rmdir($path);
        }
    }

    /**
     * 文件下载
     * @param $file
     */
    public function downLoad($file)
    {
        if (file_exists($file)) {
            $openFile = fopen($file, 'r');
            //返回文件类型
            Header('Content-type: application/octet-iostream');
            //返回文件的字节大小
            Header('Accept-Range: bytes');
            //返回文件大小
            Header('Accept-Length: ' . $file);
            //这里对客户端弹出的对话框，对应的文件名
            Header('Content-disposition: filename=' . substr($file, strrpos($file, '/') + 1));
            $buffer = 1024;
            while (!feof($openFile)) {
                $file_data = fread($openFile, $buffer);
                echo $file_data;
            }
            fclose($file);

            @unlink($file);
        } else {

            echo '下载文件不存在';
        }
    }
}
